package org.dromara.ai.domain.dto;

import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;

/**
 * AI聊天响应DTO
 *
 * @author RuoYi
 * @since 2024-01-01
 */
@Data
@Accessors(chain = true)
public class AiChatResponse implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 响应ID
     */
    private String id;

    /**
     * 对象类型
     */
    private String object;

    /**
     * 创建时间
     */
    private Long created;

    /**
     * 模型名称
     */
    private String model;

    /**
     * 选择列表
     */
    private List<Choice> choices;

    /**
     * 使用情况
     */
    private Usage usage;

    /**
     * 系统指纹
     */
    private String systemFingerprint;

    /**
     * 提供商名称
     */
    private String provider;

    /**
     * 响应时间（毫秒）
     */
    private Long responseTime;

    /**
     * 是否成功
     */
    private Boolean success;

    /**
     * 错误信息
     */
    private String error;

    /**
     * 错误代码
     */
    private String errorCode;

    /**
     * 知识库检索结果
     */
    private List<KnowledgeResult> knowledgeResults;

    /**
     * 扩展信息
     */
    private Map<String, Object> extra;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 选择项
     */
    @Data
    @Accessors(chain = true)
    public static class Choice implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 索引
         */
        private Integer index;

        /**
         * 消息
         */
        private AiChatRequest.AiMessage message;

        /**
         * 增量消息（流式）
         */
        private AiChatRequest.AiMessage delta;

        /**
         * 结束原因
         */
        private String finishReason;

        /**
         * 日志概率
         */
        private Object logprobs;
    }

    /**
     * 使用情况
     */
    @Data
    @Accessors(chain = true)
    public static class Usage implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 提示token数
         */
        private Integer promptTokens;

        /**
         * 完成token数
         */
        private Integer completionTokens;

        /**
         * 总token数
         */
        private Integer totalTokens;

        /**
         * 提示token详情
         */
        private Object promptTokensDetails;

        /**
         * 完成token详情
         */
        private Object completionTokensDetails;
    }

    /**
     * 知识库检索结果
     */
    @Data
    @Accessors(chain = true)
    public static class KnowledgeResult implements Serializable {

        private static final long serialVersionUID = 1L;

        /**
         * 文档ID
         */
        private String documentId;

        /**
         * 文档标题
         */
        private String title;

        /**
         * 文档内容
         */
        private String content;

        /**
         * 相似度分数
         */
        private Double score;

        /**
         * 元数据
         */
        private Map<String, Object> metadata;
    }

    /**
     * 结束原因枚举
     */
    public enum FinishReason {
        STOP("stop"),
        LENGTH("length"),
        FUNCTION_CALL("function_call"),
        TOOL_CALLS("tool_calls"),
        CONTENT_FILTER("content_filter");

        private final String value;

        FinishReason(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }
    }
}